package main

import (
	"context"
	"fmt"
	"time"
)

// 主要是练习context
// 说明了一个问题，主线程的子线程等待着，如果子线程中开启了一个线程，那么两条线程是并发存在的
// 如果worker return的话，开启的新线程还会执行下去
func worker(ctx context.Context) <-chan int {
	ch := make(chan int)
	n := 1
	go func() {
		for {
			select {
			case <-ctx.Done():
				return // 返回退出 避免内存泄漏
			default:
				ch <- n
				n++
			}
		}
	}()
	fmt.Println(".......")
	return ch
}

func worker1() {

	d := time.Now().Add(50000 * time.Millisecond)
	ctx, cancel := context.WithDeadline(context.Background(), d)

	// 尽管ctx会过期，但在任何情况下调用它的cancel函数都是很好的实践。
	// 如果不这样做，可能会使上下文及其父类存活的时间超过必要的时间。
	defer cancel()

	select {
	case <-time.After(1 * time.Second):
		fmt.Println("overslept")
	case <-ctx.Done():
		fmt.Println(ctx.Err())
	}
}

func main() {
	// ctx, cancel := context.WithCancel(context.Background())
	// defer cancel()
	// for v := range worker(ctx) {
	// 	if v == 10 {
	// 		break
	// 	}
	// 	fmt.Println(v)

	// }

	worker1()

}
